/*
 * @lc app=leetcode.cn id=151 lang=cpp
 *
 * [151] 翻转字符串里的单词
 */

// @lc code=start
class Solution
{
public:
    string reverseWords(string s)
    {
        //反转单词 而且需要删除多余的空格
        //首先删除字符串前的空格 双指针
        int slow = 0;
        int fast = 0;
        //首先将fast指针指向第一个不为空格的位置
        while (s.size() > 0 && fast < s.size() && s[fast] == ' ')
        {
            fast++;
        }
        //处理字符串中间多余的空格
        //如果上一个字符为空格 当前也为空格就跳过 否则将fast处字符填入slow
        while (fast < s.size())
        {
            if (fast > 1 && s[fast - 1] == ' ' && s[fast] == ' ')
            {
                //这里初次fast是指的第一个不为空字符 上一个字符可能为空
                //而且字符间空格也不可能是初次fast的位置 fast>1
                fast++;
                continue;
            }
            else
            {
                //将fast填入slow处
                s[slow++] = s[fast++];
            }
        }
        //最后处理字符串末尾的空格 当前slow指向字符串末尾+1
        //因为fast最后一个地方可能为空格 导致处理后字符串末尾多了一个空格 需要去除
        if (slow - 1 >= 0 && s[slow-1] == ' ')
        {
            s.resize(slow - 1);
        }
        else
        {
            s.resize(slow);
        }
        //现在处理完了所有多余空格
        //首先需要反转字符串 然后依次反转各个单词
        reverse(s.begin(), s.end());
        //反转单词
        slow = 0;
        fast = 0;
        while (fast <= s.size())
        {
            //fast移动到下一个空格处
            while (fast < s.size() && s[fast] != ' ')
            {
                fast++;
            }
            reverse(s.begin() + slow, s.begin() + fast);
            slow = fast + 1; //移动slow到下一个单词开头
            fast++;          //fast同上
        }
        return s;
    }
};
// @lc code=end
